package services

import (
	"chat/models"
	"chat/pkg/utils"
	"errors"

	"golang.org/x/crypto/bcrypt"
)

// UserService 用户服务
type UserService struct{}

// Register 用户注册
func (s *UserService) Register(username, password, nickname string) error {
	var user models.User
	// 检查用户名是否已存在
	result := utils.DB.Where("username = ?", username).First(&user)
	if result.RowsAffected > 0 {
		return errors.New("用户名已存在")
	}

	// 密码加密
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}

	// 创建新用户
	newUser := models.User{
		Username: username,
		Password: string(hashedPassword),
		Nickname: nickname,
	}

	return utils.DB.Create(&newUser).Error
}

// Login 用户登录
func (s *UserService) Login(username, password string) (string, error) {
	var user models.User
	// 查找用户
	result := utils.DB.Where("username = ?", username).First(&user)
	if result.Error != nil {
		return "", errors.New("用户不存在")
	}

	// 验证密码
	err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
	if err != nil {
		return "", errors.New("密码错误")
	}

	// 生成token
	token, err := utils.GenerateToken(user.ID)
	if err != nil {
		return "", err
	}

	// 更新在线状态
	utils.DB.Model(&user).Update("online", true)

	return token, nil
}

// Logout 用户登出
func (s *UserService) Logout(userID uint) error {
	return utils.DB.Model(&models.User{}).Where("id = ?", userID).Update("online", false).Error
}

// GetUserInfo 获取用户信息
func (s *UserService) GetUserInfo(userID uint) (*models.User, error) {
	var user models.User
	result := utils.DB.First(&user, userID)
	if result.Error != nil {
		return nil, errors.New("用户不存在")
	}
	return &user, nil
}

// GetUsers 获取用户列表
func (s *UserService) GetUsers() ([]models.User, error) {
	var users []models.User
	result := utils.DB.Find(&users)
	if result.Error != nil {
		return nil, result.Error
	}
	return users, nil
}
